import axios from "axios";
import NProgress from "nprogress";
import "nprogress/nprogress.css";
// 三个层次
// 1.全局配置（最低）
// 2.实例配置（次之）
// 3.拦截器配置（最高）
// axios有函数型、对象型的不同请求方式

// axios.defaults.baseURL = "http://39.98.123.211:8510/api";
// axios.defaults.headers.common["Authorization"] = "global token string";

const instance = axios.create({
  baseURL: "/mock",
  timeout: 20000,
});

// instance.defaults.headers.common["Authorization"] = "instance token string";

instance.interceptors.request.use(
  function (config) {
    NProgress.start();
    config.headers = {
      Authorization: "interceptors token",
    };
    return config;
  },
  function (error) {
    return Promise.reject(error);
  }
);

instance.interceptors.response.use(
  function (response) {
    NProgress.done();
    // 主要针对企业的状态码进行判断操作，因为你在接口请求的时候虽然可能是成功，但是返回的内容根据业务需求的不同可能对企业来说没有任何的意义
    if (response.data.code === 200) {
      return response.data;
    }
    // 其实也可以针对http状态码进行处理，但主要处理的是200-300之间的状态码
    if (response.status >= 200 && response.status <= 300) {
      return response.data;
    }

    return response;
  },
  function (error) {
    // 通常处理的是http状态码错误
    if (error && error.response) {
      switch (error.response.status) {
        case 400:
          error.message = "请求错误";
          break;
        case 401:
          error.message = "未授权，请登录";
          break;
        case 403:
          error.message = "拒绝访问";
          break;
        case 404:
          error.message = `请求地址出错: ${error.response.config.url}`;
          break;
        case 408:
          error.message = "请求超时";
          break;
        case 500:
          error.message = "服务器内部错误";
          break;
        case 501:
          error.message = "服务未实现";
          break;
        case 502:
          error.message = "网关错误";
          break;
        case 503:
          error.message = "服务不可用";
          break;
        case 504:
          error.message = "网关超时";
          break;
        case 505:
          error.message = "HTTP版本不受支持";
      }
      console.log(error.message); // 以后可以对错误信息进行统一处理
    }
    return Promise.reject(error);
  }
);

export default instance;
